# encoding:utf-8
'''
@author : xaing
@time : 2018/5/9 22:27
@地址 : 广州
@作用 : sqlite3的数据库操作
@结果 :
'''

import sqlite3
import os

'''SQLite数据库是一款非常小巧的嵌入式开源数据库软件，也就是说
没有独立的维护进程，所有的维护都来自于程序本身。
在python中，使用sqlite3创建数据库的连接，当我们指定的数据库文件不存在的时候
连接对象会自动创建数据库文件；如果数据库文件已经存在，则连接对象不会再创建
数据库文件，而是直接打开该数据库文件。
    连接对象可以是硬盘上面的数据库文件，也可以是建立在内存中的，在内存中的数据库
    执行完任何操作后，都不需要提交事务的(commit)

    创建在硬盘上面： conn = sqlite3.connect('c:\\test\\test.db')
    创建在内存上面： conn = sqlite3.connect('"memory:')

    下面我们一硬盘上面创建数据库文件为例来具体说明：
    conn = sqlite3.connect('c:\\test\\hongten.db')
    其中conn对象是数据库链接对象，而对于数据库链接对象来说，具有以下操作：

        commit()            --事务提交
        rollback()          --事务回滚
        close()             --关闭一个数据库链接
        cursor()            --创建一个游标

    cu = conn.cursor()
    这样我们就创建了一个游标对象：cu
    在sqlite3中，所有sql语句的执行都要在游标对象的参与下完成
    对于游标对象cu，具有以下具体操作：

        execute()           --执行一条sql语句
        executemany()       --执行多条sql语句
        close()             --游标关闭
        fetchone()          --从结果中取出一条记录
        fetchmany()         --从结果中取出多条记录
        fetchall()          --从结果中取出所有记录
        scroll()            --游标滚动

'''



'''
数据库 sql
create table '91Table'(
        'id' varchar(36) null,   -- id标识
        'title' varchar(1000) null,  -- 标题
        'duration' datetime null,       -- 时长
        'collection' varchar(36) null,  -- 未知？
        'href' varchar(1000) null,   -- 视频的页面地址
        'realUrl' varchar(1000) null  -- 视频真实地址
    ) 
    
    传递的data数据，键值对形式， 后面的1对应第一个 ？
    data = [('HongtenAA', 1),
            ('HongtenBB', 2),
            ('HongtenCC', 3),
            ('HongtenDD', 4)]

'''


# 数据库位置
DB_URl = "E:\\kaiFa\\python\\test\\pachong91\\91.db"



def getConnection():
    '''
    获取数据库连接
    :return: 返回数据库连接
    '''
    conn = sqlite3.connect(DB_URl)
    print("获取到数据库连接！")
    return conn

def close(conn, cu):
    '''关闭数据库游标对象和数据库连接对象'''
    try:
        if cu is not None:
            cu.close()
    finally:
        if cu is not None:
            cu.close()

def getCursor(conn):
    '''该方法是获取数据库的游标对象，参数为数据库的连接对象
    如果数据库的连接对象不为None，则返回数据库连接对象所创
    建的游标对象；否则返回一个游标对象，该对象是内存中数据
    库连接对象所创建的游标对象'''
    if conn is not None:
        return conn.cursor()
    else:
        return getConnection().cursor()


def createTable(conn, sql):
    '''
    创建表
    :param conn: 数据库连接
    :param sql: 建表的sql
    :return: 无返回
    '''
    if sql is not None and sql != '':
        cu = getCursor(conn)
        print('执行sql:[{}]'.format(sql))
        cu.execute(sql)
        conn.commit()
        print("创建数据库表成功！")
        close(conn, cu)
    else:
        print("数据库sql是空的，请检查")


def create91SQLDB():
    '''
    创建91数据库
    :return:
    '''
    print("开始创建91数据库`````")
    sql = '''create table table91(
        'id' varchar(36) null,   -- id标识
        'title' varchar(1000) null,  -- 标题
        'duration' varchar(20) null,       -- 时长
        'year' varchar(10) null,
        'collection' varchar(36) null,  -- 未知？
        'href' varchar(1000) null,   -- 视频的页面地址
        'realUrl' varchar(1000) null  -- 视频真实地址
        )'''
    conn = getConnection()
    createTable(conn, sql)

def executeSQL(conn, sql, data):
    '''
    执行sql,使用更新、插入、删除语句
    :param conn: 数据库连接
    :param sql: 插入的sql语句，语句类似 INSERT INTO student values (?, ?, ?, ?, ?, ?)
    :param data: 要插入的数据 [(1, 'Hongten', '男', 20, '广东省广州市', '13423****62'),（..）]
    :return:
    '''
    cu = getCursor(conn)
    for d in data:
        cu.execute(sql, d)
        conn.commit()
    close(conn, cu)

def selectSQL(conn, sql):
    '''
    执行查询sql，返回多条或一条数据
    :param conn: 数据库连接
    :param sql: 查询的sql
    :return:
    '''
    cu = getCursor(conn)
    cu.execute(sql)
    result = cu.fetchall()
    return result

def forSelect(result):
    '''
    对查询结果进行遍历
    :param result: 查询的结果集
    :return: 无返回
    '''
    if len(result) > 0:
        for e in range(len(result)):
            print(result[e])


